import csv,os
import matplotlib.pyplot as plt

# 设置matplotlib以显示中文，避免乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 检查CSV文件是否已存在
def is_file_exists(filename):
    try:
      return os.path.exists(filename)
    except PermissionError:
        print("没有足够的权限来执行文件操作。")

# 检查是否已存在相同的数据行
def is_duplicate_data(data, filename):
    if not is_file_exists(filename):
        return False

    with open(filename, mode='r', newline='') as file:
        reader = csv.reader(file)
        for row in reader:
            if row[0] == data[0] and int(row[1]) == data[1] and float(row[2]) == data[2] and float(row[3]) == data[3]:
                return True
    return False
# 主菜单
def menu():
    print("\n===== BMR计算器 =====")
    print("1. 计算BMR指数")
    print("2. 生成CSV文件表头")
    print("3. 退出程序")

    choice = input("请选择操作（1/2/3）: ")
    return choice

# BMR计算模块
def count():
    while True:
        print("\n===== 计算BMR =====")
        gender = input("请输入您的性别（男/女）: ").lower()
        if gender not in["男","女"]:
            print("性别输入错误，请输入'男'或'女'")
            continue
        try:
            age_input = input("请输入您的年龄: ")
            height_input =input("请输入您的身高（单位：厘米）: ")
            weight_input = input("请输入您的体重（单位：千克）: ")
        # 解析带有单位的输入并进行单位转换
            age = int(age_input.split('岁')[0]) if '岁' in age_input else int(age_input)
            height = float(height_input.split('厘米')[0]) if '厘米' in height_input else float(height_input)
            weight = float(weight_input.split('千克')[0]) if '千克' in weight_input else float(weight_input)
        except ValueError:
            print("年龄、身高和体重必须是有效数字。")
            continue
        if gender == '男':
            bmr = 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age)
        elif gender == '女':
            bmr = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age)

        print(f"您的BMR指数为: {bmr:.2f}")

        data = [gender, age, height, weight, bmr]
        if not is_duplicate_data(data, 'bmr_data.csv'):
            save_to_csv(data)
        else:
            print("相同的数据已存在，不保存到CSV文件。")
        break
# 保存数据到CSV文件
def save_to_csv(data):
    try:
        with open('bmr_data.csv', mode='a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow(data)
        print("数据已保存到CSV文件。")
        # 修改读取BMR数据的代码
        bmr_values = []
        with open('bmr_data.csv', mode='r') as file:
            reader = csv.reader(file)
            next(reader)  # 跳过表头行
            for row in reader:
                bmr = float(row[4])
                bmr_values.append(bmr)

        # 所有BMR数据按从小到大排序
        bmr_values = sorted(bmr_values)

        # 绘制BMR数据的柱状图
        plt.bar(range(len(bmr_values)), bmr_values)
        plt.xlabel('数据点')
        plt.ylabel('BMR指数')
        plt.title('BMR数据')
        plt.show()
    except PermissionError:
        print("没有足够的权限来执行文件操作。")

# 生成CSV文件表头
def list_start():
    try:
        if not is_file_exists('bmr_data.csv'):
            with open('bmr_data.csv', mode='w', newline='') as file:
                writer = csv.writer(file)
                writer.writerow(['性别', '年龄', '身高（厘米）', '体重（千克）', 'BMR指数'])
            print("CSV文件表头已生成。")
        else:
            print("CSV文件表头已存在，无需再次生成。")
    except PermissionError:
        print("没有足够的权限来执行文件操作。")

# 主函数
def main():
    while True:
        choice = menu()
        if choice == '1':
            count()
        elif choice == '2':
            list_start()
        elif choice == '3':
            print("感谢使用BMR计算器，再见！")
            break
        else:
            print("无效选择，请重新选择。")

if __name__ == "__main__":
    main()
